package ar.unsam.tp1.test

import ar.unsam.tp1.programa.Administrador
import ar.unsam.tp1.programa.Estandar
import ar.unsam.tp1.programa.Infraccion
import ar.unsam.tp1.programa.Jugador
import ar.unsam.tp1.programa.Partido
import org.junit.Before
import org.junit.Test

import static org.mockito.Matchers.*
import static org.mockito.Mockito.*

class TestEnvioMensajes {
	var Partido partido
	var mockAdmin = mock(typeof(Administrador))
	var mockInfraccion = mock(typeof(Infraccion))
	var mockJugador = mock(typeof(Jugador))
	var Jugador jugador1
	var Jugador jugador2
	var Jugador jugador3
	var Jugador jugador4
	var Jugador jugador5
	var Jugador jugador6
	var Jugador jugador7
	var Jugador jugador8
	var Jugador jugador9

	@Before
	def void init() {
		partido = new Partido()

		jugador1 = new Jugador("jugador1")
		jugador2 = new Jugador("jugador2")
		jugador3 = new Jugador("jugador3")
		jugador4 = new Jugador("jugador4")
		jugador5 = new Jugador("jugador5")
		jugador6 = new Jugador("jugador6")
		jugador7 = new Jugador("jugador7")
		jugador8 = new Jugador("jugador8")
		jugador9 = new Jugador("jugador9")

		jugador1.setTipoDeInscripcion(new Estandar())
		jugador2.setTipoDeInscripcion(new Estandar())
		jugador3.setTipoDeInscripcion(new Estandar())
		jugador4.setTipoDeInscripcion(new Estandar())
		jugador5.setTipoDeInscripcion(new Estandar())
		jugador6.setTipoDeInscripcion(new Estandar())
		jugador7.setTipoDeInscripcion(new Estandar())
		jugador8.setTipoDeInscripcion(new Estandar())
		jugador9.setTipoDeInscripcion(new Estandar())

		partido.admin = mockAdmin
	}

	@Test
	def void testMensajeEnviadoJugadorAdminAlta() {
		when(mockInfraccion.getPuntos()).thenReturn(0)
		when(mockJugador.getNombre()).thenReturn(new String("Jugador mock"))
		when(mockJugador.getTipoDeInscripcion()).thenReturn(new Estandar())
		when(mockJugador.getInfraccion()).thenReturn(mockInfraccion)

		partido.alta(jugador1)
		partido.alta(jugador2)
		partido.alta(jugador3)
		partido.alta(jugador4)
		partido.alta(jugador5)
		partido.alta(jugador6)
		partido.alta(jugador7)
		partido.alta(jugador8)
		partido.alta(mockJugador)
		partido.alta(jugador9)

		verify(mockJugador, times(1)).enviarMensaje(anyString())
		verify(mockAdmin, atLeast(1)).enviarMensaje(anyString())
	}

	@Test
	def void testMensajeEnviadoAdminBaja() {
		when(mockInfraccion.getPuntos()).thenReturn(0)
		when(mockJugador.getNombre()).thenReturn(new String("Jugador mock"))
		when(mockJugador.getTipoDeInscripcion()).thenReturn(new Estandar())
		when(mockJugador.getInfraccion()).thenReturn(mockInfraccion)

		partido.alta(jugador1)
		partido.alta(jugador2)
		partido.alta(jugador3)
		partido.alta(jugador4)
		partido.alta(jugador5)
		partido.alta(jugador6)
		partido.alta(jugador7)
		partido.alta(jugador8)
		partido.alta(mockJugador)
		partido.alta(jugador9)

		partido.baja(jugador9)

		verify(mockAdmin, atLeast(1)).enviarMensaje(anyString())
	}
}
